perm filename HASH.PAS[S1,ALS] blob sn#458948 filedate 1979-07-17 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(*PROGRAM HEADER PAGE*)
C00005 00003	program PRINTHASH (INPUT,OUTPUT)
C00008 00004	function OPC_HASH (var MNEM :  CHAR4) :  integer
C00018 ENDMK
CāŠ—;
(*PROGRAM HEADER PAGE*)

(*PAS10 OPTIONS*) (*$D+,R32,S1300*)			(*X10S1*)

(*							     DEFAULT

D+	DEBUG AND POSTMORTEM DUMP				-
E+	EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED		-
Fn	FILE OPTION						1
I+	FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES		-
L+	OBJECT LISTING						-
Rn	SIZE OF LOW-SEGMENT				(SEE PAS10 MANUAL)
Sn	MAX INSTRUCTIONS PER STATEMENT			       1000
T+	RUNTIME CHECK						+
U+	72 COLUMN FORMAT					-
Xn	HIGHEST REGISTER FOR PARAMETERS				6
*)

(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)

(*							     DEFAULT

A+	GENERATE 370 OBJECT MODULE				-
A-	GENERATE 370 ASSEMBLY MODULE
B+	BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS		-
C+	EMIT PCODE						+
D+	RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES	-
E+	FILE IS IN EBCDIC CHARACTER SET				-
F+	SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY			+
K+	ENABLE STATEMENT EXECUTION COUNTING			-
L+	LIST SOURCE PROGRAM					+
M+	72 COLUMN FORMAT					+
P+	DOUBLE-WORD BOUNDARY ALIGNMENT				-
S+	SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY			+
T+	PRINT SYMBOL TABLES (FOR POST-PROCESSOR)		-
U+	GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR.	-
V+	?? 3RD PCODE BGN INSTRUCTION PARAMETER			-
X+	USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES	-
X-	GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)

(*S1 PCPASC OPTION DIFFERENCES*) (* A+,B+,D+,L-,M120*)	(*X10S1*)



(*							     DEFAULT

A+	GENERATE S1 ASSEMBLY MODULE				-
A-	GENERATE S1 OBJECT MODULE
*)

(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
program PRINTHASH (INPUT,OUTPUT);
(* Fixed for new opc list 6july79 *)
const
(*OPCHTSIZE = 257;
OPCHTSIZEM1 = 256; *)
OPCHTSIZE = 263;
OPCHTSIZEM1 = 262;
(*OPCHTSIZE = 223;
OPCHTSIZEM1 = 222; *)
(*OPCHTSIZE = 239; 
OPCHTSIZEM1 = 238;*)
MAX1 = 200000; 
MAX2 = 20000;
MAX3 = 2000;
MAX4 = 2000;

type
CHAR4 = packed array [1..4] of char;
U_OPCODE = (U   ,
    UABS ,UADD ,USUB ,UMPY ,UDIV ,UADJ ,UAND ,UBGN ,UBGNB,UCHKF,
    UCHKH,UCHKL,UCHKN,UCHKT,UCLAB,UCOMM,UCSP ,UCUP ,UCVT ,UCVT2,
    UDEAD,UDEC ,UDEF ,UDIF ,UDMD ,UDOA ,UDSP ,UDUP ,UEND ,UENDB,
    UENT ,UEXPP,UEXPV,UFJP ,UICUP,UGOOB,UMOV ,UEQU ,UNEQ ,UGEQ ,
    ULES ,UIEQU,UINEQ,UIGEQ,UIGRT,UILEQ,UILES,UILOD,UIMOV,UIMPP,
    UIMPV,UINC ,UINN ,UINST,UINT ,UIOR ,UISTR,UIXA ,ULAB ,ULCA ,
    ULDA ,ULDC ,ULDP ,ULEX ,ULIVE,ULOC ,ULOD ,UMDEF,UMOD ,UMST ,
    UMUS ,UNEG ,UNEW ,UNOT ,UNSTR,UODD ,UOPTN,UPAR ,UPLEX,UPLOD,
    UPSTR,URET ,URND ,USDEF,USGS ,USQR ,USTP ,USTR ,USWP ,USYM ,
    UTJP ,UTYP ,UTYP2,UUJP ,UUNI ,UUNK ,UXJP ,UXOR ,UGRT ,ULEQ );


var
    I : 0..OPCHTSIZEM1;
    H : 0..OPCHTSIZEM1;
    J : integer;
    K : integer;
    L : integer;
    M,M1,M2,M3,M4 : integer;
    OPC :  U_OPCODE;
    MNEM :  CHAR4;						(*7FEB79 ALS*)

    OPCHASHTAB :  array [0..OPCHTSIZEM1] of
			record
			OPCNAM :  CHAR4;
			OPCHIT1 : CHAR4;
			OPCHIT2 : CHAR4;
			OPC :  U_OPCODE;
			HIT : integer;
			STEP : integer;
			end (*OPCHASHTAB*);

function OPC_HASH (var MNEM :  CHAR4) :  integer;
  var
    I :	integer;
    TMP1	: integer;
    TMP2	: integer;

    begin
    OPC_HASH :=(ord(MNEM[1])*M1 + ord(MNEM[2])*M2 + ord(MNEM[3])*M3
 		 +ord(MNEM[4])*M4) mod OPCHTSIZE; 
(*  OPC_HASH := (ord(MNEM[1])*507 + ord(MNEM[2])*26 + ord(MNEM[3])
		 +ord(MNEM[4])*31) mod OPCHTSIZE; *)

(**** The best so far with 263 in table
	  M1	      M2	  M3	      M4	TOTAL HITS	MAX. STEPS
         512        2048          64           8           9 HITS           1 *)
(*  OPC_HASH := ((( ord(MNEM[2])*4 + ord(MNEM[1]))*8 + ord(MNEM[3]))*8
		 +ord(MNEM[4])*8) mod OPCHTSIZE; *)

(*
	TMP1 := 0;
	for I := 1 to 4 do TMP1 :=(3 * TMP1) + ORD(MNEM[I]);
	TMP2 := TMP1 div OPCHTSIZE;
	TMP1 := TMP1 mod OPCHTSIZE;
	OPC_HASH := (TMP1 + TMP2) mod OPCHTSIZE;
*)
    end (*OPC_HASH*);

procedure ENTER_OPC (NAM :  CHAR4;  OPC :  U_OPCODE);
    var H : 0..OPCHTSIZEM1;
    begin
    H := OPC_HASH(NAM);
    L := 0;
    while OPCHASHTAB[H].OPCNAM <> '    ' do
	begin
	H := (H + 1) mod OPCHTSIZE;
	OPCHASHTAB[H].OPCHIT2 := OPCHASHTAB[H].OPCHIT1;
	OPCHASHTAB[H].OPCHIT1 := OPCHASHTAB[H-1].OPCNAM;
	J := J + 1;
	L := L + 1;
	end;
    if L > M then M := L;
    OPCHASHTAB[H].OPCNAM := NAM;
    OPCHASHTAB[H].OPC := OPC;
(*  OPCHASHTAB[H].HIT := K; *)
    OPCHASHTAB[H].STEP := L;
    end (*ENTER_OPC*);

procedure PRINT_OPC;
    var H : 0..OPCHTSIZEM1;
    begin
    WRITELN;
    for H := 0 to OPCHTSIZEM1 do
(*	begin
	WRITE (OUTPUT,H,'  '); *)
	if OPCHASHTAB[H].STEP > 0 then
	    begin
	    WRITELN (OUTPUT,H,OPCHASHTAB[H].OPCNAM,
		OPCHASHTAB[H].OPCHIT1,OPCHASHTAB[H].OPCHIT2);
     	    WRITELN (TTY,H,OPCHASHTAB[H].OPCNAM,
		OPCHASHTAB[H].OPCHIT1,OPCHASHTAB[H].OPCHIT2); BREAK;
	    end;
(*	if OPCHASHTAB[H].OPCNAM = '    ' then WRITELN else
	    begin
	    WRITELN (OUTPUT,OPCHASHTAB[H].OPCNAM,OPCHASHTAB[H].OPC);
  	    if OPCHASHTAB[H].HIT = 0 then WRITELN else
		WRITE (OUTPUT,OPCHASHTAB[H].HIT); 
  	    if OPCHASHTAB[H].STEP = 0 then WRITELN else
		WRITELN (OUTPUT,OPCHASHTAB[H].STEP);
	    end;
	end;*)
    end;
  
begin (*MAIN PROGRAM*)
J := 0;
K := 1000;
M1 := 512;
while(( M1 <= MAX1 ) and (k > 9 )) do
  begin (* while M1 <= MAX1 *)
  M2 := 512;
  while (M2 <= MAX2)  do
    begin
    M3 := 1;
    while( M3 <= MAX3)  do
      begin
      M4 := 1;
      while ( M4 <= MAX4) do
	begin
    for I := 0 to OPCHTSIZEM1 do
	begin
	OPCHASHTAB[I].OPCNAM := '    ';
	OPCHASHTAB[I].OPCHIT1 := '    ';
	OPCHASHTAB[I].OPCHIT2 := '    ';
	OPCHASHTAB[I].STEP := 0 ;
	OPCHASHTAB[H].HIT := 0 ;
	end;
	
    J := 0;
ENTER_OPC ('ABS ', UABS);	ENTER_OPC ('ADD ', UADD);
ENTER_OPC ('SUB ', USUB);	ENTER_OPC ('MPY ', UMPY);
ENTER_OPC ('DIV ', UDIV);	ENTER_OPC ('ADJ ', UADJ);
ENTER_OPC ('AND ', UAND);	ENTER_OPC ('BGN ', UBGN);
ENTER_OPC ('BGNB', UBGNB);	ENTER_OPC ('CHKF', UCHKF);
ENTER_OPC ('CHKH', UCHKH);	ENTER_OPC ('CHKL', UCHKL);
ENTER_OPC ('CHKN', UCHKN);	ENTER_OPC ('CHKT', UCHKT);
ENTER_OPC ('CLAB', UCLAB);	ENTER_OPC ('COMM', UCOMM);
ENTER_OPC ('CSP ', UCSP);	ENTER_OPC ('CUP ', UCUP);
ENTER_OPC ('CVT ', UCVT);	ENTER_OPC ('CVT2', UCVT2);
ENTER_OPC ('DEAD', UDEAD);	ENTER_OPC ('DEC ', UDEC);
ENTER_OPC ('DEF ', UDEF);	ENTER_OPC ('DIF ', UDIF);
ENTER_OPC ('DMD ', UDMD);	ENTER_OPC ('DOA ', UDOA);
ENTER_OPC ('DSP ', UDSP);	ENTER_OPC ('DUP ', UDUP);
ENTER_OPC ('END ', UEND);	ENTER_OPC ('ENDB', UENDB);
ENTER_OPC ('ENT ', UENT);	ENTER_OPC ('EXPP', UEXPP);
ENTER_OPC ('EXPV', UEXPV);	ENTER_OPC ('FJP ', UFJP);
ENTER_OPC ('ICUP', UICUP);	ENTER_OPC ('GOOB', UGOOB);
ENTER_OPC ('MOV ', UMOV);	ENTER_OPC ('EQU ', UEQU);
ENTER_OPC ('NEQ ', UNEQ);	ENTER_OPC ('GEQ ', UGEQ);
ENTER_OPC ('LES ', ULES);	ENTER_OPC ('IEQU', UIEQU);
ENTER_OPC ('INEQ', UINEQ);	ENTER_OPC ('IGEQ', UIGEQ);
ENTER_OPC ('IGRT', UIGRT);	ENTER_OPC ('ILEQ', UILEQ);
ENTER_OPC ('ILES', UILES);	ENTER_OPC ('ILOD', UILOD);
ENTER_OPC ('IMOV', UIMOV);	ENTER_OPC ('IMPP', UIMPP);
ENTER_OPC ('IMPV', UIMPV);	ENTER_OPC ('INC ', UINC);
ENTER_OPC ('INN ', UINN);	ENTER_OPC ('INST', UINST);
ENTER_OPC ('INT ', UINT);	ENTER_OPC ('IOR ', UIOR);
ENTER_OPC ('ISTR', UISTR);	ENTER_OPC ('IXA ', UIXA);
ENTER_OPC ('LAB ', ULAB);	ENTER_OPC ('LCA ', ULCA);
ENTER_OPC ('LDA ', ULDA);	ENTER_OPC ('LDC ', ULDC);
ENTER_OPC ('LDP ', ULDP);	ENTER_OPC ('LEX ', ULEX);
ENTER_OPC ('LIVE', ULIVE);	ENTER_OPC ('LOC ', ULOC);
ENTER_OPC ('LOD ', ULOD);	ENTER_OPC ('MDEF', UMDEF);
ENTER_OPC ('MOD ', UMOD);	ENTER_OPC ('MST ', UMST);
ENTER_OPC ('MUS ', UMUS);	ENTER_OPC ('NEG ', UNEG);
ENTER_OPC ('NEW ', UNEW);	ENTER_OPC ('NOT ', UNOT);
ENTER_OPC ('NSTR', UNSTR);	ENTER_OPC ('ODD ', UODD);
ENTER_OPC ('OPTN', UOPTN);	ENTER_OPC ('PAR ', UPAR);
ENTER_OPC ('PLEX', UPLEX);	ENTER_OPC ('PLOD', UPLOD);
ENTER_OPC ('PSTR', UPSTR);	ENTER_OPC ('RET ', URET);
ENTER_OPC ('RND ', URND);	ENTER_OPC ('SDEF', USDEF);
ENTER_OPC ('SGS ', USGS);	ENTER_OPC ('SQR ', USQR);
ENTER_OPC ('STP ', USTP);	ENTER_OPC ('STR ', USTR);
ENTER_OPC ('SWP ', USWP);	ENTER_OPC ('SYM ', USYM);
ENTER_OPC ('TJP ', UTJP);	ENTER_OPC ('TYP ', UTYP);
ENTER_OPC ('TYP2', UTYP2);	ENTER_OPC ('UJP ', UUJP);
ENTER_OPC ('UNI ', UUNI);	ENTER_OPC ('UNK ', UUNK);
ENTER_OPC ('XJP ', UXJP);	ENTER_OPC ('XOR ', UXOR);
ENTER_OPC ('GRT ', UGRT);	ENTER_OPC ('LEQ ', ULEQ);

      if J < K then
	begin
	K := J;
	WRITELN (OUTPUT,M1,M2,M3,M4,K);
	WRITELN (TTY,M1,M2,M3,M4,K); BREAK; 
	if K < 11 then PRINT_OPC; 
	end; (* if J < K then *)
        M := 0;
	M4 := M4*2;
	end; (* while M4 <= MAX do *)
      M3 := M3*2;
      end; (* while M4*M3 <= NAX do *)
    M2 := M2*2;
    end; (* while M4*M3*M2 <= MAX do *)
  M1 := M1*2;
  end; (* WHILE M1 <= MAX *)
end. (* main*)